# -*- coding: utf8 -*-

from types import LambdaType
from typing import Any, List, Callable, Iterable
from os.path import splitext


def is_blank(
    s: str
) -> bool:
    r''' 判断指定的字符串是否是空字符串。

    :param s: 原字符串。

    :return: 如果参数`s`是`None`或者长度为0或者全部是空白字符。
    '''
    return s is None or len(s) == 0 or s.isspace()


def strip_str(
    v: Any
) -> str:
    r''' 将指定的字符串去掉首尾空格。

    :param v: 原字符串。

    :return: 去掉首尾空格的结果，如果参数`v`是`None`那么返回空字符串。
    '''
    if v is None:
        return ''

    return str(v).strip()


def get_first(
    l: Iterable,
    dv: Any = None
) -> Any:
    if l is None:
        return dv
    else:
        return next(iter(l), dv)


def find_first(
    predict: Callable[[int, Any], bool],
    l: Iterable,
) -> Any:
    for i, item in enumerate(l):
        if predict(i, item):
            return item

    return None


def flat_append(
    l: List,
    key: Any,
    *args
) -> None:
    item = l.get(key, None)
    if item is None:
        l[key] = [*args]
    else:
        item.extend([*args])


def set_default_ext(
    path: str,
    ext: str
) -> str:
    path = strip_str(path)
    if not path:
        return ''

    p1, p2 = splitext(path)
    return path if p2 else p1 + ext
